/*!
 * # 数据实体类:
 *  Module - 模块
 * 
 * # 描述:
 *  表示 App 中的一个模块。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Authority.Organization.Data
{
	/// <summary>
	/// 模块。
	/// </summary>
	/// <remarks>
	/// 表示 App 中的一个模块。
	/// </remarks>
	public sealed class Module : global::Pittypat.DataModel
	{
		#region 构造函数

		/// <summary>
		/// 初始化 Module 类的一个新实例。
		/// </summary>
		public Module()
		{
			// Id
			this.Id = null;
			// 隶属 App 的 Id
			this.AppId = null;
			// 位置
			this.Position = null;
			// 标识符
			this.Identifier = null;
			// 模块名称
			this.Name = null;
			// 呈现方式
			this.Presentation = null;
			// 允许匿名访问
			this.AllowAnonymous = null;
			// 描述
			this.Description = null;
			// 授权时间
			this.GrantTime = null;
			// 有效截止时间
			this.ExpireTime = null;
		}

		#endregion

		#region 属性

		/// <summary>
		/// 获取或者设置Id。
		/// </summary>
		public @uuid? Id { get; set; }

		/// <summary>
		/// 获取或者设置隶属 App 的 Id。
		/// </summary>
		/// <remarks>
		/// 模块隶属的 App 的 Id。
		/// </remarks>
		public @uuid? AppId { get; set; }

		/// <summary>
		/// 获取或者设置位置。
		/// </summary>
		/// <remarks>
		/// 模块在同一个 App 中先后显示顺序。
		/// </remarks>
		public @int16? Position { get; set; }

		/// <summary>
		/// 获取或者设置标识符。
		/// </summary>
		/// <remarks>
		/// 模块的标识符。
		/// </remarks>
		public @string? Identifier { get; set; }

		/// <summary>
		/// 获取或者设置模块名称。
		/// </summary>
		/// <remarks>
		/// 模块的名称。
		/// </remarks>
		public @string? Name { get; set; }

		/// <summary>
		/// 获取或者设置呈现方式。
		/// </summary>
		/// <remarks>
		/// 指示模块应该如何对外呈现：0-Internal，1-UI，2-Service。
		/// </remarks>
		public @int8? Presentation { get; set; }

		/// <summary>
		/// 获取或者设置允许匿名访问。
		/// </summary>
		/// <remarks>
		/// 指示模块是否允许匿名用户访问和使用。
		/// </remarks>
		public @bool? AllowAnonymous { get; set; }

		/// <summary>
		/// 获取或者设置描述。
		/// </summary>
		/// <remarks>
		/// 对模块的描述信息。
		/// </remarks>
		public @string? Description { get; set; }

		/// <summary>
		/// 获取或者设置授权时间。
		/// </summary>
		/// <remarks>
		/// 授予目标权利的时间。
		/// </remarks>
		public @datetime? GrantTime { get; set; }

		/// <summary>
		/// 获取或者设置有效截止时间。
		/// </summary>
		/// <remarks>
		/// 授权有效截止时间。
		/// </remarks>
		public @datetime? ExpireTime { get; set; }

		#endregion

		#region 方法

		/// <summary>
		/// 从一个 DbDataReader 中读取此对象。
		/// </summary>
		/// <param name="reader">包含对象数据的 DbDataReader 对象。</param>
		/// <exception cref="global::System.ArgumentNullException">reader 是 null。</exception>
		public override void Read(global::System.Data.Common.DbDataReader reader)
		{
			if (reader == null)
			{
				throw new global::System.ArgumentNullException("reader");
			}

			// Id
			this.Id = reader.GetValue<@uuid>("Id", defaultValue: this.Id);

			// 隶属 App 的 Id
			this.AppId = reader.GetValue<@uuid>("AppId", defaultValue: this.AppId);

			// 位置
			this.Position = reader.GetValue<@int16>("Position", defaultValue: this.Position);

			// 标识符
			this.Identifier = reader.GetValue<@string>("Identifier", defaultValue: this.Identifier);

			// 模块名称
			this.Name = reader.GetValue<@string>("Name", defaultValue: this.Name);

			// 呈现方式
			this.Presentation = reader.GetValue<@int8>("Presentation", defaultValue: this.Presentation);

			// 允许匿名访问
			this.AllowAnonymous = reader.GetValue<@bool>("AllowAnonymous", defaultValue: this.AllowAnonymous);

			// 描述
			this.Description = reader.GetValue<@string>("Description", defaultValue: this.Description);

			// 授权时间
			this.GrantTime = reader.GetValue<@datetime>("GrantTime", defaultValue: this.GrantTime);

			// 有效截止时间
			this.ExpireTime = reader.GetValue<@datetime>("ExpireTime", defaultValue: this.ExpireTime);
		}

		/// <summary>
		/// 将当前对象作为 JSON 字符串写入指定的文本流。
		/// </summary>
		/// <param name="writer">目标文本流。</param>
		/// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
		public override void Write(global::System.IO.TextWriter writer)
		{
			if (writer == null)
			{
				throw new global::System.ArgumentNullException("writer");
			}

			writer.Write('{');

			// Id
			writer.Write("\"id\":");
			this.Id.Write(writer);
			writer.Write(',');

			// 隶属 App 的 Id
			writer.Write("\"appId\":");
			this.AppId.Write(writer);
			writer.Write(',');

			// 位置
			writer.Write("\"position\":");
			this.Position.Write(writer);
			writer.Write(',');

			// 标识符
			writer.Write("\"identifier\":");
			this.Identifier.Write(writer);
			writer.Write(',');

			// 模块名称
			writer.Write("\"name\":");
			this.Name.Write(writer);
			writer.Write(',');

			// 呈现方式
			writer.Write("\"presentation\":");
			this.Presentation.Write(writer);
			writer.Write(',');

			// 允许匿名访问
			writer.Write("\"allowAnonymous\":");
			this.AllowAnonymous.Write(writer);
			writer.Write(',');

			// 描述
			writer.Write("\"description\":");
			this.Description.Write(writer);
			writer.Write(',');

			// 授权时间
			writer.Write("\"grantTime\":");
			this.GrantTime.Write(writer);
			writer.Write(',');

			// 有效截止时间
			writer.Write("\"expireTime\":");
			this.ExpireTime.Write(writer);

			writer.Write('}');
		}

		#endregion
	}
}
